"""
ID 生成器工具类，用于生成唯一标识符
"""
import uuid
import time
import random
import string


class IDGenerator:
    """
    ID 生成器工具类，用于生成唯一标识符
    """
    
    def __init__(self):
        """
        初始化 ID 生成器
        """
        self.last_timestamp = 0
        self.sequence = 0
    
    def generate_uuid(self) -> str:
        """
        生成 UUID 格式的唯一标识符
        
        @return: UUID 字符串
        """
        return str(uuid.uuid4())
    
    def generate_snowflake(self) -> int:
        """
        生成雪花算法格式的唯一标识符
        
        @return: 雪花算法 ID
        """
        # 获取当前时间戳（毫秒）
        current_timestamp = int(time.time() * 1000)
        
        # 如果是同一毫秒内，序列号递增
        if current_timestamp == self.last_timestamp:
            self.sequence = (self.sequence + 1) & 0xFFF  # 序列号最大为 4095
            # 如果序列号溢出，等待下一毫秒
            if self.sequence == 0:
                while current_timestamp <= self.last_timestamp:
                    current_timestamp = int(time.time() * 1000)
        else:
            # 不同毫秒内，序列号重置
            self.sequence = 0
        
        # 更新最后时间戳
        self.last_timestamp = current_timestamp
        
        # 生成 ID（时间戳左移 22 位，机器 ID 左移 12 位，序列号不移位）
        # 这里简化处理，机器 ID 使用随机数
        machine_id = random.randint(0, 1023)  # 10 位机器 ID
        
        return ((current_timestamp - 1609459200000) << 22) | (machine_id << 12) | self.sequence
    
    def generate_random_code(self, length: int = 8) -> str:
        """
        生成指定长度的随机字符串
        
        @param length: 字符串长度
        @return: 随机字符串
        """
        chars = string.ascii_letters + string.digits
        return ''.join(random.choice(chars) for _ in range(length)) 